//
//  HomeTableViewController.swift
//  仿一个新浪微博
//
//  Created by 孙家林 on 15/9/9.
//  Copyright © 2015年 sunjialin. All rights reserved.
//

import UIKit

class HomeTableViewController: BaseTableViewController{
    
    //微博数据数组
    var statuses: [Status]? {
        
        didSet {
            //刷新数据
            tableView.reloadData()  
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //如果用户没有登录，返回访客视图
        if !UserAccount.userLogin {
            visitorView?.setUpViewInfo(true, imageName: "visitordiscover_feed_image_smallicon", message: "关注一些人，回这里看看有什么惊喜")
            return
        }
        
        prepareTableView()
   
        loadData()
        
    }
    
    private func prepareTableView() {
    
        //注册原型cell
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: StatusCellIdentifier.NormalCell.rawValue)
        tableView.registerClass(StatusForwordCell.self, forCellReuseIdentifier: StatusCellIdentifier.ForwordCell.rawValue)
        
//        //设置预估行高
        tableView.estimatedRowHeight = 300
//
//        //设置表格自动计算行高
//        tableView.rowHeight = UITableViewAutomaticDimension
        
        // 如果不使用自动计算行高UITableViewAutomaticDimension，不要使用底部约束
        
        //取消分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None

        refreshControl = HMRefreshControl()
        
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
    }
    
    //上拉刷新标记
    private var pullUpRefreshFlag = false
    
    //加载数据
     func loadData() {
        
        // 开始动画 - 只是开启了刷新控件的动画，并不会触发加载数据的方法
        refreshControl?.beginRefreshing()
        
        var since_id = statuses?.first?.id ?? 0
        
        var max_id = 0
        
        if pullUpRefreshFlag {
        
            since_id = 0
            //记录数组最后一条数据
            max_id = statuses?.last?.id ?? 0
        }
        
        Status.loadStatus(since_id, max_id: max_id) { (dataList, error) -> () in
            
            //关闭刷新控件，结束刷新动画
            self.refreshControl?.endRefreshing()
            
            if error != nil {
                
                print(error)
                return
            }
            
            let count = dataList?.count ?? 0
            
            //只有下拉刷新才显示提示
            if since_id > 0 {
            
                self.showPulldownTip(count)
            }
            
            //如果没有数据就直接返回
            if  count == 0 {
            
                return
            }
            
            if since_id > 0 {//做下拉刷新，应该将数据放在之前的数组的前面
            
                self.statuses! = dataList! + self.statuses!
            }else if max_id > 0 {//做下拉刷新，将数据放在数组的后面
                
                self.statuses! += dataList!
                
                //将下拉刷新标记复位
                self.pullUpRefreshFlag = false
            }else {
                
                self.statuses = dataList
            }
        }
    
    }
    
    //显示下拉刷新数据条数
    private func showPulldownTip(count: Int) {
        
        //定义标签文字
        tipLabel.text = (count == 0) ? "暂时没有微博" : "刷新到 \(count) 条微博"
        
        let rect = tipLabel.frame
        
        UIView.animateWithDuration(2.0, animations: { () -> Void in
            
            //自动反转动画
            UIView.setAnimationRepeatAutoreverses(true)
            
            self.tipLabel.frame = CGRectOffset(rect, 0, 3 * rect.height)
            }) { (_) -> Void in
                
                self.tipLabel.frame = rect
        }
    }
    
    //MARK: - 数据源方法
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return statuses?.count ?? 0
    }
    
    // 每次要显示 cell 的时候，会调用此方法，根据 indexPath 判断数据方法
    // 如果 indexPath == 微博数组的总数 - 1，表示要显示最后一行了
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        let status = statuses![indexPath.row]
        
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status), forIndexPath: indexPath) as! StatusCell
        
        //判断 indexpath 的数值
        if indexPath.row == statuses!.count - 1 {
            
            //设置下拉刷新标记
            pullUpRefreshFlag = true
            
            //刷新数据
            loadData()
        }
        
        cell.status = statuses![indexPath.row]
        
        return cell
    }
    
    /// 返回行高 － 如果是固定值，可以直接通过属性设置，效率更高
    /**
    行高缓存
    1. NSCache - 内存缓存，iOS 8.0 有 bug，千万不要 removeAll，一旦 removeAll 之后，再也没法使用了
    SDWebImage 存在什么问题
    1> 接收到内存警告后，内存缓存实效
    2> 加载 GIF 的时候，内存会狂飙！
    2. 自定义行高`缓存字典`
    3. 直接利用微博的`模型` - 行高数据只是一个小数，并不会有太大的内存消耗！
    不需要在控制器中，额外定义属性！
    
    提示：如果表格高度是固定的，一定不要通过代理返回行高！可以直接设置属性！
    */
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        //获取模型
        let status = statuses![indexPath.row]
        
        //判断模型中是否已经缓存了行高
        if let h = status.rowHeight {
            
            return h
        }
        
        
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status)) as? StatusCell
        
        status.rowHeight = cell!.rowHeight(status)
        
        return status.rowHeight!
    }
    
    //懒加载lebel
    private lazy var tipLabel: UILabel = {
        
        let label = UILabel(frame: CGRect(x: 0, y: -2 * 44, width: self.view.bounds.width, height: 44))
        
        label.backgroundColor = UIColor.orangeColor()
        
        label.textColor = UIColor.whiteColor()
        
        label.textAlignment = NSTextAlignment.Center
        
        //加载到navBar上不会随着tableView滚动
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
        
    }()
}
